package es.unileon.rnag.jgen.genes;

/**
 * Interfaz gen&eacute;rica que representa un gen
 * @author Abel Mayorga Gonz&aacute;lez
 * @author Sergio Fern&aacute;ndez Mart&iacute;nez
 * @version 1.0
 * @param <T> Tipo de dato que almacena el cromosoma
 */
public interface Gen<T> {
	
	/**
	 * @return El valor del gen
	 */
	T getValor();
	/**
	 * Comprueba si el valor pasado es uno de los que puede tomar el gen
	 * @param valor: Valor del que comprobar su valided
	 * @return True si el valor es v&aacute;lido, false de lo contrario
	 */
	boolean esValido(T valor);
	/**
	 * @return Cadena de bits representaci&oacute;n del gen
	 */
	String getBitString();
	/**
	 * Asigna un valor al gen actual dada una cadena de bits
	 * @param bits: Cadena de bits del valor nuevo
	 * @return True si se pude cambiar el valor, false de lo contrario
	 */
	boolean asignarValor(String bits);
	/**
	 * Asigna un valor al gen actual
	 * @param valor: Valor nuevo para el gen
	 * @return True si se puede cambiar el valor, false de lo contrario
	 */
	boolean asignarValor(T valor);
	/**
	 * Clona el gen actual
	 * @return El gen clonado
	 */
	Gen<T> clonar();
}
